
package View;
import Controller.Controller;
import java.awt.Dimension;
import java.awt.event.*;
import javax.swing.*;
/**
 * Głowna klasa widoku.
 * @param menuBar - pasek menu.
 * @param menu - menu głowne programu.
 * @param menu_zaloguj - guzik logowania w menu.
 * @param menu_wyloguj - guzik wylogowania w menu.
 * @param menu_config - guzik otwarcia konfiguracji w menu.
 * @param menu_wyjscie - guzik zamykający program.
 * @param tree - referencja na komponent drzewa plików.
 * @param controller - referencja na kontroler.
 * @param zalogowany - czy aktualnie jestesmy zalogowani.
 * @param treeScroll - umożliwia scrollowanie w drzewie plików.
 * @param mainWindowSplit - podzielenie głownego okna programu.
 * @param rightPanel - panel zawierający panele ściagania , wysyłania i przeszukiwania.
 * @param pomoc - guzik do otwarcia pomocy w pasku menu.
 */ 
public class View extends JFrame { 
    private JMenuBar menuBar;
    private JMenu menu;
    private JMenuItem menu_zaloguj;
    private JMenuItem menu_wyloguj;
    private JMenuItem menu_config;
    private JMenuItem menu_wyjscie;
    private FilesTree tree;
    private Controller controller;
    private boolean zalogowany = false;
    private JScrollPane treeScroll;
    private JSplitPane mainWindowSplit;
    private RightPanel rightPanel;
    private JMenuItem pomoc;
    
    public View(Controller controller) 
    {
        this.controller = controller;
        menuBar = new JMenuBar();
        tree = new FilesTree(controller,this,treeScroll);
        treeScroll = new JScrollPane(tree);
        treeScroll.setPreferredSize(new Dimension(450,500));
        
        rightPanel = new RightPanel(this,tree);
        mainWindowSplit = new JSplitPane(JSplitPane.HORIZONTAL_SPLIT,treeScroll,rightPanel);  
        add(mainWindowSplit);

        menu_zaloguj = new JMenuItem("Zaloguj");
        menu_wyloguj = new JMenuItem("Wyloguj/Zmien uzytkownika");
        menu_config = new JMenuItem("Konfiguracja");
        menu_wyjscie = new JMenuItem("Wyjscie");
        
        menu_zaloguj.setMnemonic('Z');
        menu_zaloguj.setAccelerator(KeyStroke.getKeyStroke("alt Z"));
        menu_wyloguj.setMnemonic('W');
        menu_wyloguj.setAccelerator(KeyStroke.getKeyStroke("alt W"));
        menu_config.setMnemonic('C');
        menu_config.setAccelerator(KeyStroke.getKeyStroke("alt C"));
        menu_wyjscie.setMnemonic('X');
        menu_wyjscie.setAccelerator(KeyStroke.getKeyStroke("alt X"));
        
        menu_zaloguj.setToolTipText("Jesli masz klopoty z zalogowaniem, sprawdz sciezke do pliku w konfiguracji");
        menu_wyloguj.setToolTipText("Uwaga: opcja kasuje plik z sesja, konieczna bedzie autoryzacja programu po ponownym zalogowaniu. Opcja jest niezalecana, gdy chcemy jednie zakonczyc program.");
        menu_config.setToolTipText("Zmiany w konfiguracji, beda aktywne po ponownym zalogowaniu!");
        menu_wyjscie.setToolTipText("Uwaga: opcja konczy program bez potwierdzenia!");
        
        
        menu = new JMenu("Menu");
        menuBar.add(menu);
        menu.add(menu_zaloguj);
        menu.add(menu_wyloguj);
        menu.add(menu_config);
        menu.add(menu_wyjscie);
        pomoc = new JMenuItem("Pomoc");
        pomoc.setMaximumSize(new Dimension(50,50));
        pomoc.setOpaque(false);
       
        pomoc.addActionListener(new ActionListener() {
            @Override
            public void actionPerformed(ActionEvent e) { 
             try {
             Help pomoc = new Help( getRootPane());
             }
             catch(RuntimeException ex) {
               showError(ex.getMessage());  
             }
           }
        });
        menuBar.add(pomoc);
        
        menu_wyloguj.setEnabled(false);
        
        menu_config.addActionListener(new ActionListener() {
          @Override
            public void actionPerformed(ActionEvent e) {
             menu_config.setEnabled(false);
              showConfigMenu();
            }
        });
        
        menu_wyjscie.addActionListener(new ActionListener() {
            @Override
            public void actionPerformed(ActionEvent e) {
             Exit();
            }
        });
               
        this.setJMenuBar(menuBar);
        this.setDefaultCloseOperation(EXIT_ON_CLOSE);
        this.setTitle("File Organizer");
        this.setSize(750,500);
        this.setVisible(true);
    }  
    /**
     * Dodaje słuchacza do guzika logowania.
     */
    public void addZalogujListener(ActionListener action) {
        menu_zaloguj.addActionListener(action);
    }
    /**
     * Dodaje słuchacza do guzika wylogowania.
     */
    public void addWylogujListener(ActionListener action) {
        menu_wyloguj.addActionListener(action);
    }
    /**
     * Otwiera nowe okno menu konfiguracyjnego.
     */
    public void showConfigMenu() {
        ConfigMenu config = new ConfigMenu(controller,this);
    }
    /**
     * Ustawia stan na zalogowany.
     */
    public void setZalogowany() {
        menu_zaloguj.setEnabled(false);
        tree.setEnabled(true);
        zalogowany = true;
        menu_wyloguj.setEnabled(true);
        this.setTitle("File Organizer - Zalogowany");
        tree.initTree();
    }/**
     * Ustawia stan na wylogowany.
     */
    public void setWylogowany() {
        menu_zaloguj.setEnabled(true);
        tree.setEnabled(false);
        zalogowany = false;
        menu_wyloguj.setEnabled(false);
        this.setTitle("File Organizer");
        tree.removeTree();
    }
    /**
     * @return czy zalogowany. 
     */
    public boolean isZalogowany() {
        return zalogowany;
    } 
    /**
     * Odblokowuje możliwość uruchomienia konfiguracyjnego po zamknięciu, 
     * potrzebne by nie można było uruchomić więcej niż jedno menu konfiguracyjne.
     */
    public void setConfigMenuEnabled() {
        menu_config.setEnabled(true);   
    } 
    /**
     * Kończy program.
     */
    public void Exit(){
        this.setVisible(false);
        this.dispose();
        System.exit(0);
    }
    /**
     * Wyświetla bład w widoku
     * @param err treść błędu.
     */
    public void showError(String err) {
        JOptionPane.showMessageDialog(this,
        err,
        "Wystąpił błąd.",
        JOptionPane.ERROR_MESSAGE);
    }
    /**
     * Dodaje nowe zadanie w panelu pobierania.
     * @param title - nazwa zadania.
     */
    public void addNewDownload(String title) {
        rightPanel.addNewDownload(title);
    }
    /**
     * Aktualizuje progres zadania w menu pobierania.
     * @param title - nazwa zadania.
     * @param val - nowa wartość postępu.
     */
    public void updateDownloadProgress(String title, int val) {
        rightPanel.updateDownloadProgress(title, val);
    }
     /**
     * Dodaje nowe zadanie w panelu wysyłania.
     * @param title - nazwa zadania.
     */
    public void addNewUpload(String title) {
        rightPanel.addNewUpload(title);
    }
     /**
     * Aktualizuje progres zadania w menu wysyłania.
     * @param title - nazwa zadania.
     * @param val - nowa wartość postępu.
     */
    public void updateUploadProgress(String title, int val) {
        rightPanel.updateUploadProgress(title, val);
    }
    /**
     * Sprawdza czy zadanie znajduje się już na liście wysyłania.
     * @param title nazwa zadania.
     * @return true jeśli sukces, fałsz w przeciwnym przypadku.
     */
    public boolean uploadExists(String title) {
        return rightPanel.uploadExists(title);
    }
     /**
     * Sprawdza czy zadanie znajduje się już na liście pobierania.
     * @param title nazwa zadania.
     * @return true jeśli sukces, fałsz w przeciwnym przypadku.
     */
    public boolean downloadExists(String title) {
        return rightPanel.downloadExists(title);
    }
    /**
    * Znajduje węzeł w drzewie na podstawie nazwy (dopasowanie nazwa węzła jest dokładnie równa szukanej frazie).
    * @param name - nazwa do wyszukania.
    * @return prawda gdy udało się znaleźć taki węzeł , falsz w przeciwnym przypadku.
    */
    public boolean findEqual(String title) {
        return tree.findEqual(title);
    }
    /**
     * Znajduje węzeł w drzewie na podstawie nazwy (dopasowanie zawierające frazę).
     * @param name - nazwa węzła.
    */
    public void find(String title) {
        tree.find(title);
    }
}
